package com.iwhalecloud.bss.kite.cucc.web.service.accept.handler.attr;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.iwhalecloud.bss.kite.client.api.scene.operate.IOperateSceneCommonService;
import com.iwhalecloud.bss.kite.client.dto.DataResult;
import com.iwhalecloud.bss.kite.client.vo.scene.CommonAttrVO;
import com.iwhalecloud.bss.kite.common.constant.ErrorConsts;
import com.iwhalecloud.bss.kite.common.constant.KeyConsts;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.client.api.order.IOrderService;
import com.iwhalecloud.bss.kite.cucc.client.dto.pos.KitePosAttrDTO;
import com.iwhalecloud.bss.kite.cucc.client.dto.pos.KitePosDTO;
import com.iwhalecloud.bss.kite.cucc.common.util.DateFormatUtils;
import com.iwhalecloud.bss.kite.manager.api.IOperateSceneInstService;
import com.iwhalecloud.bss.kite.manager.api.IQuerySceneInstService;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.service.scene.attr.OperateInstAttrService;
import com.iwhalecloud.bss.kite.web.context.KiteWebContext;
import com.iwhalecloud.bss.kite.web.service.accept.attr.handler.AbstractAttrHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 1、初始化 全程要求完成日期 = 原全程要求完成日期+(解挂的当天日期-挂起日期)
 */
@Service
public class HangAllCompleteAttrHandler extends AbstractAttrHandler {
    @Autowired
    private IQuerySceneInstService querySceneInstService;

    @Autowired
    private IOrderService orderService;

    @Autowired
    private IOperateSceneCommonService operateSceneCommonService;

    @Autowired
    private IOperateSceneInstService operateSceneInstService;

    @Autowired
    OperateInstAttrService operateInstAttrService;

    @Override
    public void init(CommonAttrVO commonAttr) {
        String sceneInstId = KiteWebContext.getContext().getCurrentSceneInstId();
        String lockOrReleaseOpType = querySceneInstService.getExtParameterValue(sceneInstId, "lockOrReleaseOpType");
        String nowDate = DateFormatUtils.getFormatedDate();
        // 原全程要求完成日期 调接口 或者直接从属性取 默认当前时间
        String oldAllCompleteDateValue = nowDate;
        // 挂起日期 调接口 或者直接从属性取
        String hangDate = nowDate;
        // 全程要求完成日期
        String allCompleteDate = "";

        if (KiteStringUtils.equals("RELEASE", lockOrReleaseOpType)) {
            // 调接口
            String orderId = querySceneInstService
                .getExtParameterValue(sceneInstId, "outOrderId");
            Map<String, Object> orderInfo = orderService.getOrderDetail(orderId);
            KitePosDTO kitePosDTO = JSONObject
                .toJavaObject(JSON.parseObject(JSON.toJSONString(orderInfo)), KitePosDTO.class);
            List<KitePosAttrDTO> attrs = kitePosDTO.getOrder().getAttrs();
            for (KitePosAttrDTO attr : attrs) {
                // 原全程要求完成日期
                if (KiteStringUtils.equals("ORD10012", attr.getCode())) {
                    oldAllCompleteDateValue = attr.getValue();
                }
                // 挂起时间
                if (KiteStringUtils.equals("ORD10278", attr.getCode())) {
                    hangDate = attr.getValue();
                }
            }
            // 解挂的当天日期 按yyyy-MM-dd
            String openDate = DateFormatUtils.getFormatedDate();
            // 解挂的当天日期-挂起日期 两个日期之差（天）
            int betweenDate = DateFormatUtils.getDayByStrs(hangDate, openDate, DateFormatUtils.DATE_FORMAT);
            // 原全程要求完成日期 String转Date
            Date oldAllCompleteDate = DateFormatUtils.parseStrToDate(oldAllCompleteDateValue);
            // 全程要求完成日期 = 原全程要求完成日期+(解挂的当天日期-挂起日期)
            Date newDate = DateFormatUtils.addDay(oldAllCompleteDate, betweenDate); // 日期增加天数
            allCompleteDate = DateFormatUtils.formatDate(newDate, DateFormatUtils.DATE_FORMAT); // Date转String
            // 如果全程要求完成时间小于当前时间，修改为当前时间
            if (DateFormatUtils.compareDate(nowDate, allCompleteDate, DateFormatUtils.DATE_FORMAT) > 0) {
                allCompleteDate = nowDate;
            }
            // A端要求完成时间/PE端要求完成时间
            KiteAttr aFinishAttr = querySceneInstService.getCommonAttr(sceneInstId, "2_0000122");
            // Z端要求完成时间/CE端要求完成时间
            KiteAttr zFinishAttr = querySceneInstService.getCommonAttr(sceneInstId, "2_0000123");
            if (Objects.nonNull(aFinishAttr) && Objects.nonNull(zFinishAttr)) {
                Date azDate = DateFormatUtils.addDay(newDate, -2); // 日期增加天数
                String azDateValue = DateFormatUtils.formatDate(azDate, DateFormatUtils.DATE_FORMAT);
                // 如果A/Z端要求完成时间小于当前时间，修改为当前时间
                if (DateFormatUtils.compareDate(nowDate, azDateValue, DateFormatUtils.DATE_FORMAT) > 0) {
                    azDateValue = nowDate;
                }
                aFinishAttr.setValue(azDateValue);
                aFinishAttr.setValueDesc(azDateValue);
                zFinishAttr.setValue(azDateValue);
                zFinishAttr.setValueDesc(azDateValue);
                operateSceneInstService.setCommonAttr(sceneInstId, aFinishAttr);
                operateSceneInstService.setCommonAttr(sceneInstId, zFinishAttr);
            }
            commonAttr.setValue(allCompleteDate);
            commonAttr.setValueDesc(allCompleteDate);

            // 挂起时限
            KiteAttr hangDateAttr = querySceneInstService.getCommonAttr(sceneInstId, "ORD10279");
            if(Objects.nonNull(hangDateAttr)){
                hangDateAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_H);
                hangDateAttr.setIsNull(KeyConsts.IFTRUE_T);
                operateSceneCommonService.setCommonAttr(sceneInstId, hangDateAttr);
            }

        } else if (KiteStringUtils.equals("LOCK", lockOrReleaseOpType)) {
            commonAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_H);
            commonAttr.setIsNull(KeyConsts.IFTRUE_T);

        }
        setCommonAttr(commonAttr);
    }

    @Override
    public DataResult<Boolean> apply(String sceneInstId, String fieldName, String value, String valueDesc) {
        if (KiteStringUtils.isEmpty(value)) {
            return super.apply(sceneInstId, fieldName, value, valueDesc);
        }
        String lockOrReleaseOpType = querySceneInstService.getExtParameterValue(sceneInstId, "lockOrReleaseOpType");
        String nowDate = DateFormatUtils.getFormatedDate();
        // 原全程要求完成日期 调接口 或者直接从属性取
        String oldAllCompleteDateValue = "";
        // 挂起日期 调接口 或者直接从属性取
        String hangDate = "";
        // 全程要求完成日期
        String allCompleteDate = "";
        if (KiteStringUtils.equals("RELEASE", lockOrReleaseOpType)) {
            // 调接口
            String orderId = querySceneInstService
                .getExtParameterValue(sceneInstId, "outOrderId");
            Map<String, Object> orderInfo = orderService.getOrderDetail(orderId);
            KitePosDTO kitePosDTO = JSONObject
                .toJavaObject(JSON.parseObject(JSON.toJSONString(orderInfo)), KitePosDTO.class);
            List<KitePosAttrDTO> attrs = kitePosDTO.getOrder().getAttrs();
            for (KitePosAttrDTO attr : attrs) {
                // 原全程要求完成日期
                if (KiteStringUtils.equals("ORD10012", attr.getCode())) {
                    oldAllCompleteDateValue = attr.getValue();
                }
                if (KiteStringUtils.equals("ORD10278", attr.getCode())) {
                    hangDate = attr.getValue();
                }
            }
            // 解挂的当天日期 按yyyy-MM-dd
            String openDate = DateFormatUtils.getFormatedDate();
            // 解挂的当天日期-挂起日期 两个日期之差（天）
            int betweenDate = DateFormatUtils.getDayByStrs(hangDate, openDate, DateFormatUtils.DATE_FORMAT);
            // 原全程要求完成日期 String转Date
            Date oldAllCompleteDate = DateFormatUtils.parseStrToDate(oldAllCompleteDateValue);
            // 全程要求完成日期 = 原全程要求完成日期+(解挂的当天日期-挂起日期)
            Date newDate = DateFormatUtils.addDay(oldAllCompleteDate, betweenDate); // 日期增加天数
            allCompleteDate = DateFormatUtils.formatDate(newDate, DateFormatUtils.DATE_FORMAT); // Date转String
            if (DateFormatUtils.compareDate(nowDate, value, DateFormatUtils.DATE_FORMAT) > 0) {
                ErrorConsts.BUSI_COMMON_ERROR.throwOut("全程要求完成时间不能早于当前时间");
            }

            // A端要求完成时间/PE端要求完成时间
            KiteAttr aFinishAttr = querySceneInstService.getCommonAttr(sceneInstId, "2_0000122");
            // Z端要求完成时间/CE端要求完成时间
            KiteAttr zFinishAttr = querySceneInstService.getCommonAttr(sceneInstId, "2_0000123");
            if (Objects.nonNull(aFinishAttr) && Objects.nonNull(zFinishAttr)) {
                Date azDate = new Date();
                if(KiteStringUtils.equals(value,allCompleteDate)){
                    azDate = DateFormatUtils.addDay(newDate, -2); // 日期增加天数
                }else{
                    // 修改全程要求完成日期，联动AZ段要求完成时间
                    Date modifyDate = DateFormatUtils.parseStrToDate(value);
                    azDate = DateFormatUtils.addDay(modifyDate, -2); // 日期增加天数
                }
                String azDateValue = DateFormatUtils.formatDate(azDate, DateFormatUtils.DATE_FORMAT);
                // 如果A/Z端要求完成时间小于当前时间，修改为当前时间
                if (DateFormatUtils.compareDate(nowDate, azDateValue, DateFormatUtils.DATE_FORMAT) > 0) {
                    azDateValue = nowDate;
                }
                aFinishAttr.setValue(azDateValue);
                aFinishAttr.setValueDesc(azDateValue);
                zFinishAttr.setValue(azDateValue);
                zFinishAttr.setValueDesc(azDateValue);
                operateSceneInstService.setCommonAttr(sceneInstId, aFinishAttr);
                operateSceneInstService.setCommonAttr(sceneInstId, zFinishAttr);
            }
            // 挂起时限
            KiteAttr hangDateAttr = querySceneInstService.getCommonAttr(sceneInstId, "ORD10279");
            if(Objects.nonNull(hangDateAttr)){
                hangDateAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_H);
                hangDateAttr.setIsNull(KeyConsts.IFTRUE_T);
                operateSceneCommonService.setCommonAttr(sceneInstId, hangDateAttr);
            }
        } else if (KiteStringUtils.equals("LOCK", lockOrReleaseOpType)) {

        }
        return super.apply(sceneInstId, fieldName, value, valueDesc);
    }
}
